﻿using System;
using System.Collections.Generic;
using System.Transactions;
using DomainModel;
using Microsoft.Practices.ServiceLocation;
using ServiceLayer.ExternalServices;

namespace ServiceLayer
{
    public class SignalementManagementService : ISignalementManagementService
    {
        public void CreateSignalement(string userName, int objetPatrimonialId, int panneId, DateTime observationDate, string comments)
        {
            using (var tx = new TransactionScope())
            {
                if (AuthorizationService.IsAllowedToReportPanne (userName) == false) 
                    throw new InvalidOperationException("Vous n'avez pas le droit de signaler une panne");

                var signalementRepository = ServiceLocator.Current.GetInstance<ISignalementRepository>();
                if (signalementRepository.IsPanneAlreadyReported(objetPatrimonialId, panneId))
                    throw new InvalidOperationException("Cette panne a déja été signalée pour cet élément");

                var signalement = Signalement.CreateSignalementWithAutomaticDelay(objetPatrimonialId, panneId, observationDate, comments);
                if (signalement != null)
                {
                    signalementRepository.Add(signalement);
                    signalementRepository.SaveChanges();
                    ResourcePlanningService.ScheduleSignalement(signalement);
                }

                tx.Complete();
            }
        }

        public List<Signalement> GetPendingSignalements()
        {
            var signalementRepository = ServiceLocator.Current.GetInstance<ISignalementRepository>();
            return signalementRepository.FindAll();
        }

        public List<ObjetPatrimonial> GetAllObjetPatrimonials()
        {
            var objetPatrimonialRepository = ServiceLocator.Current.GetInstance<IObjetPatrimonialRepository>();
            return objetPatrimonialRepository.FindAll();
        }

        public List<Panne> GetAllPannes()
        {
            var panneRepository = ServiceLocator.Current.GetInstance<IPanneRepository>();
            return panneRepository.FindAll();
        }
    }
}
